#include <iostream>
#include <unistd.h>
#include <pthread.h>

using namespace std;

#define NUM 5
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 想要让多线程依次访问该临界资源
int cnt = 0;

// 自增cnt
void* AddCount(void* args)
{
    pthread_detach(pthread_self());
    int num = (size_t)args;
    printf("thread %d creat sucess\n", num);
    while(true) {
        pthread_mutex_lock(&mutex);
        /*注意，pthread_cond_wait()会自动释放该线程的锁*/
        pthread_cond_wait(&cond, &mutex);
        printf("Thread-%d, cnt: %d\n", num, cnt++);
        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    for(size_t i = 0;i < NUM; ++i) {
        pthread_t tid;
        /*注意这里不能传(void*)&i，和主线程共享同一个i。因为不清楚主线程和子线程哪一个先运行。
        如果主线程跑的很快，直接把i递增到了4，那么此时所有的线程的num就是4了，这就出现了并发问题*/
        pthread_create(&tid, nullptr, AddCount, (void*)i);
        usleep(1000);       // 保证顺序性，让结果好观察
    }
    sleep(3);
    printf("main thread start control\n");
    while(true) {
        sleep(1);
        // pthread_cond_signal(&cond);     // 唤醒在cond等待队列下等待的一个线程，默认第一个
        pthread_cond_broadcast(&cond);
    }   
    return 0;
}